package com.weareint.feigncopy;

import java.util.List;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 *
 *
 * <pre>
 *  缓存 接口
 * </pre>
 *
 * @author johnny
 * @date 2021-08-21 10:22 下午
 */
public interface FeignCache<D, T> {

    /**
     * 从 缓存中 获取 数据
     *
     * @param timeContext ： context
     * @return : 缓存中 获取数据
     */
    List<D> fromCache(CacheTimeContext timeContext);

    /**
     * 缓存key
     *
     * @return : 得到 缓存key list
     */
    Set<String> cacheKey();

    /**
     * 缓存key 转 ids
     *
     * @param cacheKeys : 缓存keys
     * @return : 转ids
     */
    List<T> cacheKeyToIds(List<String> cacheKeys);

    /**
     * 构造 缓存时长context
     *
     * @param timeUnit : timeUnit
     * @param duration : duration
     * @return : CacheTimeContext
     */
    default CacheTimeContext cacheTime(TimeUnit timeUnit, long duration) {
        return new CacheTimeContext() {
            @Override
            public TimeUnit timeUnit() {
                return timeUnit;
            }

            @Override
            public Long duration() {
                return duration;
            }
        };
    }

    interface CacheTimeContext {
        /**
         * 缓存时间单位
         *
         * @return : TimeUnit
         */
        TimeUnit timeUnit();

        /**
         * 缓存时长
         *
         * @return ：duration
         */
        Long duration();
    }
}
